package com.lyrcsoft.rxjava1x.operators.convert;

import lombok.extern.slf4j.Slf4j;
import rx.Observable;
import rx.functions.Action1;
import rx.functions.Func1;

import java.util.ArrayList;
import java.util.List;

/**
 * @author fujc2dev@126.com
 * @date 2024-11-20
 */
@Slf4j
public class Rx1flatMapIterable {
    public static void main(String[] args) {
        log.debug("----------- rxJavaFlatMapIterable ---------");
        List<Student> students = new ArrayList<>();
        List<Source> sources = new ArrayList<>();
        sources.add(new Source(1, "化学", 80));
        sources.add(new Source(2, "物理", 79));
        sources.add(new Source(3, "生物", 78));
        students.add(new Student("小明1", 1, sources));
        students.add(new Student("小明2", 1, sources));

        Observable.from(students)
                .flatMapIterable(new Func1<Student, Iterable<Source>>() {
                    @Override
                    public Iterable<Source> call(Student student) {
                        log.debug("Item: " + student.name);
                        // 返回的是一个序列，序列，序列
                        return student.mSources;
                    }
                })
                .subscribe(new Action1<Source>() {
                    @Override
                    public void call(Source source) {
                        log.debug("Item: " + source + " 执行调用 获取线程id:" + Thread.currentThread().getId());
                    }
                });
        /**
         * flatMap：并行执行，平铺，被观察者订阅的是新的Observable序列，序列，是序列，平铺的每个都Observable，这些Observable声明周期
         * flatMapIterable：并行执行，平铺，被观察者订阅的还是原来的是IterableObservable序列，在IterableObservable的声明周期内，发射多次而已。
         * call里面遍历这个集合，虽然看不懂太详细的代码，通过调试，依稀能看到一些执行流程；
         * OnSubscribeFlattenIterable： 内部call，没看懂设置的add(FlattenIterableSubscriber) ，但是内部是执行了FlattenIterableSubscriber的OnNext，
         *
         *  Iterable<? extends R> iterable = mapper.call(NotificationLite.<T>getValue(v)); 就是回调我们被观察者，然后返回集合数据
         *  在里面判断返回的iterable是否为空，如果不为空，就有一个while循环，去循环执行onNext方法。
         *
         */
    }
}
